package com.songlanyun.modules.goods.service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.songlanyun.common.drive.IBaseService;
import com.songlanyun.common.enums.GoodsConstant;
import com.songlanyun.common.utils.PageUtils;
import com.songlanyun.modules.account.entity.AccountEntity;
import com.songlanyun.modules.goods.entity.Goods;
import com.songlanyun.modules.goods.model.dto.GoodsDTO;
import com.songlanyun.modules.goods.model.dto.GoodsStatusDTO;
import com.songlanyun.modules.goods.model.dto.PullChainGoodsDto;
import com.songlanyun.modules.goods.model.dto.SetGoodsGroupDTO;
import com.songlanyun.modules.goods.model.vo.GoodsSlimVo;
import com.songlanyun.modules.shop.entity.ShopEntity;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 商家所发商品表
 *
 * @author lubo
 * @email sunlightcs@gmail.com
 * @date 2020-11-05 10:01:59
 */
public interface GoodsService extends IBaseService<Long, Goods> {
    /**
     * 查询商品
     * @param shopId
     * @param id
     * @return
     */
    Goods getByShopIdAndId(Long shopId, Long id);

    Goods getById( Long id,boolean tw);


    BigDecimal getUserGoodsDiscount(Long userId, Goods goods);


    /**
     * 添加商品
     * @param shopId
     * @param dto
     * @return
     */
    Goods add(Long shopId, GoodsDTO dto);

    /**
     * 修改商品
     * @param shopId
     * @param dto
     * @return
     */
    Goods update(Long shopId,GoodsDTO dto);

    /**
     * 审核商品
     * @param goodsId
     * @param dto
     * @return
     */
    void check(Long goodsId, GoodsStatusDTO dto);

    /**
     * 上下架商品
     * @param shopId
     * @param dto
     * @return
     */
    void added(Long shopId, GoodsStatusDTO dto);

    /**
     * 设置热销
     * @param shopId
     * @param dto
     */
    void hot(Long shopId, GoodsStatusDTO dto);

    void hot(Long goodsId);

    /**
     * 设置新品
     * @param shopId
     * @param dto
     */
    void newGoods(Long shopId, GoodsStatusDTO dto);

    /**
     * 设置成推荐
     * @param shopId
     * @param dto
     */
    void recommend(Long shopId, GoodsStatusDTO dto);

    /**
     * 代销平台商品
     * @param shopId
     * @param goodsId
     */
    void auth(Long shopId, Long goodsId);

    /**
     * 取消商品代销
     * @param shopId
     * @param goodsId
     */
    void cancelAuth(Long shopId, Long goodsId);



    /**
     * 查询自营商品
     * @param params
     * @return
     */
    PageUtils queryShopPage(Map<String, Object> params);


    /**
     * 查询自营商品
     * @param params
     * @return
     */
    PageUtils querySelfPage(Map<String, Object> params);


    /**
     * 平台查询所有商家商品（为了审核）
     * @param params
     * @return
     */
    PageUtils queryALLPage(Map<String, Object> params);


    /**
     * 平台总店的商品（为了审核）
     * @param params
     * @return
     */
    PageUtils queryPlatformPage(Map<String, Object> params);

    /**
     * 普通商家代销的平台总店发布的商品
     * @param params
     * @return
     */
    PageUtils queryProxyPage(Map<String, Object> params);

    /**
     * 分页查询全平台商品
     * @param params 查询参数，包含以下几个参数：
     *               houniao_level1_category_id 候鸟的一级分类ID
     *               category_id 惠选系统的商品分类ID
     *               title 商品的关键字
     *               limit 分页查询时每页的最大记录数
     *               page 分页查询时的页码
     * @return 查询到的所有商品
     */
    PageUtils allPlatformPage(Map<String, Object> params);

    /**
     * 查询商家的直营商品，并显示是否参加了活动
     * @param params
     * @return
     */
    PageUtils querySelfForActivityPage(Map<String, Object> params);


    void setProxyGoodsGroup(Long shopId, SetGoodsGroupDTO dto);

    void delete(Long shopId, Long id);

    void updateAverageById(Long goodsId, BigDecimal average);

    void setProxy(Long shopId, GoodsStatusDTO dto);

    List<GoodsSlimVo> loadList(Map<String, Object> params);

    PageUtils newAddedGoodsList(Map<String, Object> params);

    Integer saleGoodsNum(Long startTime,Long endTime);

    List<GoodsSlimVo> saleGoodsListByTime(Long startTime,Long endTime,Integer limit);

    List<GoodsSlimVo> saleGoodsList(Integer limit);

    List<GoodsSlimVo> monthSaleGoodsList(Integer limit,Integer mixNum);

    void openUserDiscount(Long shopId, GoodsStatusDTO dto);

    int countByTemplate(Integer id);

    Integer loadCount(Map<String, Object> params);

    PageUtils pointGoodsGage(Map<String, Object> params);

    PageUtils freeGoodsGage(Map<String, Object> params);

    List<GoodsSlimVo> smartRecommend(Map<String, Object> params);

    Integer goodsStatistics(Long shopId, Integer added);

    Integer rarelyGoodsNum(Long shopId);

    PageUtils randRecommend(Map<String, Object> params);

    void pullThirdGoods(PullChainGoodsDto dto);

    Integer getThirdNum(Long shopId,Long thirdSpuId);

    Goods loadByThirdSpuId(Long goodsId);

    List<GoodsSlimVo> queryRecommend(List<Long> goodsIds);

    /**
     * 商品新增
     */
    void addHouniaoGoods(Integer currentPage,String tradeTypeId);
    /**
     * 单个商品新增 商品表
     * @param jsonObject
     * @return
     */
    List<Goods> goodsAddss(JSONObject jsonObject);
    /**
     * 单个商品新增 其他表
     * @param goodsList
     * @param goodsInfoList
     */
    void goodsDetailsAndInventoryPreservation(List<Goods> goodsList, JSONArray jsonArray);

    /**
     * 通过goodsSpu查询商品
     * @param goodsSpu
     */
    Goods getByGoodsSpu(String goodsSpu);

    List<Goods> selectAreaGoods();
}

